/*
 *  1. 原始写法 --模块就是实现特定功能的一组方法，只要把不同的函数，以及记录状态的变量简单的放在一起
 *  就算是一个模块；这样一来先执行那个函数，再执行哪个函数就很明了了
 *  
 * function fn1(){
 * 	...
 * }
 * function fn2(){
 * 	...
 * }
 * 
 * 
 *  2. 对象的写法 --伪类解决上面的缺点，可以把模块写成一个对象，所有的模块成员都放在这个对象里面
 *  var module1 = new Object({
 * 	_count1: 0,
 *  fn1: function(){
 * 	...
 * },
 *  fn2: function(){
 * 	...
 * }
 * });
 * 
 * 
 * 3. 立即执行函数的写法（IIFE）immediately invoked function expression
 * var module1 = (function(){
 * 	var count = 0;
 *  var fn1 = function(){
 * 	 ...
 * }
 *  var fn2 = function(){
 * 	 ...
 * }
 * 
 * return {
 * 	fn1: fn1,
 *  fn2: fn2
 * }
 * })()
 * 
 * 
 * 4. 放大模式 --如果一个模快很大，则需要分成几个部分，或者一个模块需要继承另一个模块，这是有必要采用”放大镜模式“
 * var module1 = (function(mod){
 * 	mod.fn3 = function(){
 * 	 ...
 * }
 * return mod;
 * })(module1);
 * 
 * 5. 宽放大模式 --在浏览器环境中，模块的各个部分通常都是从网上获取的，有时无法知道哪个部分先加载。
 * 此时则需要采用“宽放大模式”
 * var module1 = (function(mod){
 * 	...
 *  return mod;
 * })(window.module1 || {});
 *
 * 6. 输入全局变量 -- 为了模块内部调用全局变量，必须显示的将其他变量输入模块；
 * var module1 = (function($, YAHOO){
 * 	...
 * })(jQuery, YAHOO);
 * 
 * 
 * 
 * 7. 模块的规范 --目前通行的模块规范有两种：common.js和AMD.js
 * 
 * 8. common.js 2009年由美国程序员Ryan Dahl创造了node.js项目，将JavaScript语音应用于服务端编程
 * common.js中有个全局性的方法require（），用于加载模块，假定有一个模块newModule.js，就可以像下面这样加载
 *   var math = require('math');
 *   
 *   var math = require('math');
 *   math.add(2, 3);
 * 
 * 9. 浏览器环境  重大的局限问题产生了。
 *   var math = require('math');
 *   math.add(2, 3);
 * 这两行代码，第二行代码必须要在第一行require语句完成之后才能运行。考虑的更长远一点就不难发现，如果
 * 该模块加载时间很长，则整个应用就会停在那里等。因此，浏览器的模块不能采用”同步加载“（sync），而要采用
 * "异步加载"（async），这就是AMD规范产生的背景。
 * 
 * 10. AMD--asynchronous module definition缩写
 * AMD也采用了require语句加载模块，但不同的是，它要求有两个参数：
 * --01. 第一个参数[module],是一个数组，里面的成员就是它要加载的模块；
 * --02. 第二个参数callback，则是加载成功之后的回调函数。
 * 改写上面的两行代码：
 * require（['math'], function(){
 * 	math.add(2, 3);
 * }）
 * 
 * 
 * 
 * 第三部分、 require.js
 * 1. 为什么要用require.js
 * 答：同步加载必须保证所有js文件的加载顺序；
 * 
 * 2.如何加载require.js？
 * 方法有2：第一、把该文件放在网页底部； 第二、<script src="js/require.js" defer async="true"></script>
 * defer 这个属性主要针对IE浏览器因为它不支持 async
 * 
 * 3. 加载主js
 * <script src="js/require.js" data-main="js/main"></script>
 * data-main的作用是加载主模块，由于require.js默认加载的文件后缀名是js，所以可以把main.js写成main
 * 
 * 如果我们的模块不依赖任何其他模块，这时我们可以直接写入JavaScript代码。
 * require（['moduleA', 'moduleB', 'moduleC'], function(moduleA, moduleB, moduleC){
 * 	some code here
 * }）
 * require函数接受两个参数。可以看出，第一个参数是一个数组，表示的是所依赖的模块；第二个参数是
 * 一个回调函数，当前面的指定的模块被加载成功以后，它将被调用。加载的模块将以参数的形式传入该函数，
 * 从而在该函数内部可以使用这些模块。
 * 
 * 4. 模块的加载
 * 上个示例中，主模块main.js依赖三个模块，分别是'moduleA', 'moduleB', 'moduleC'。默认情况下，
 * 假定这三个模块与main在同一个目录，文件名分别是moduleA.js, moduleB.js, moduleC.js,然后自动加载。
 * 
 * 使用require.config（）方法，我们可以对模块的加载行为进行自定义。
 * require.config（）方法就写在main.js的头部，它的参数就是一个对象，这个对象的各个paths属性就是
 * 指定的各个模块的加载路径。
 * 
 * 如： require.config({
 * 	paths: {
 * 	    'moduleA': 'moduleA.min',
 * 	    'moduleB': 'moduleB.min',
 * 	    'moduleC': 'moduleC.min'
 *   }
 * })
 * 上述代码给出的三个模块的文件名，路径默认与main.js在同一个目录（如：js子目录）。如果这些模块在
 * 其他目录，比如js/lib目录，则有两种写法。
 * 一种是逐一指定路径:
 * require.config({
 * 	paths: {
 * 	  'moduleA': 'lib/moduleA.min',
 * 	  'moduleB': 'lib/moduleB.min',
 * 	  'moduleC': 'lib/moduleC.min',
 * }
 * })
 * 
 * 第二种是直接改变基路径：
 * require.config({
 *  baseUrl: 'js/lib',
 * 	paths: {
 * 	    'moduleA': 'moduleA.min',
 * 	    'moduleB': 'moduleB.min',
 * 	    'moduleC': 'moduleC.min'
 *   }
 * })
 * 
 * 如果某个模块在另一台主机上，也可以指定它的网址，比如：
 * require.config({
 * 	paths: {
 * 	   'moduleA': 'https://ajax.googleapis.com/ajax/lib/jquery/1.7.2/jquery.min'
 *   }
 * })
 * 
 * 5. AMD模块的写法
 * require.js加载的模块，采用AMD规范，也就是它必须遵照AMD的规范来写。
 * 具体来说，就是模块必须采用特定的define（）函数来定义。
 * 如果一个模块不依赖其他模块，则可以
 *  require.
 * 
 * 
 * 
 * 
 * 
 * */